package main

// 度：任一元素出现频数的最大值
// 找到和nums拥有相同大小度的最短连续子数组

// 找出众数，以及第一次出现和最后一次出现的位置
// 若有多个众数，则取区间长度最短的

type entry struct {
	cnt  int
	l, r int // 元素始末位置
}

func findShortestSubArray(nums []int) int {
	m := make(map[int]entry)
	for i, v := range nums {
		if e, has := m[v]; has {
			e.cnt++
			e.r = i
			m[v] = e
		}else{
			m[v] = entry{1,i,i}
		}
	}
	maxCnt := 0
	var res int
	for _,e := range m {
		if e.cnt > maxCnt{
			maxCnt = e.cnt
			res = e.r - e.l + 1
		}else if e.cnt == maxCnt {
			res = min(res, e.r - e.l +1)
		}
	}
	return res
}


func min(a,b int) int {
	if a<b {
		return a
	}
	return b
}